import { constantRoutes, routerMap } from "@/router";
import { serverRouterMap } from "@/api/permission";
import Layout from "@/views/layout/Layout";
import { Message } from "element-ui";

function generateAsyncRouter(routerMap, serverRouterMap) {
    if (serverRouterMap !== undefined) {
        //console.log(serverRouterMap)
        serverRouterMap.forEach(function(item, index) {
            item.component = routerMap[item.component];
            if (item.children) {
                if (item.children.length > 0) {
                    generateAsyncRouter(routerMap, item.children);
                }
            }
        });
        return serverRouterMap;
    }
}
/**
 * 通过meta.role判断是否与当前用户权限匹配
 * @param roles
 * @param route
 */
function hasPermission(roles, route) {
    if (route.meta && route.meta.roles) {
        return roles.some(role => route.meta.roles.includes(role));
    } else {
        return true;
    }
}

function getHomeRoutes(roles) {
    var home = {
        path: "/",
        component: Layout,
        redirect: "/homePage",
        meta: {
            title: "首页",
            icon: "qq"
        },
        children: []
    };
    return home;
}
/**
 * 递归过滤异步路由表，返回符合用户角色权限的路由表
 * @param routes asyncRoutes
 * @param roles
 */
export function filterAsyncRoutes(routes, roles) {
    const res = [];
    if (routes !== undefined) {
        routes.forEach(route => {
            const tmp = {...route };
            if (hasPermission(roles, tmp)) {
                if (tmp.children) {
                    tmp.children = filterAsyncRoutes(tmp.children, roles);
                }
                res.push(tmp);
            }
        });
    }

    return res;
}

const permission = {
    state: {
        routes: [],
        addRoutes: []
    },
    mutations: {
        SET_ROUTES: (state, routes) => {
            state.addRoutes = routes;
            state.routes = constantRoutes.concat(routes);
        }
    },
    actions: {
        GenerateRoutes({ commit }, data) {
            return new Promise(resolve => {
                const { roles } = data;
                //获取路由
                serverRouterMap().then(response => {
                    let accessedRouters;
                    let jsons1 =
                        JSON.stringify(response.data.data) !== "{}" ?
                        response.data.data["0"] :
                        [];

                    // console.log(jsons1)
                    let jsons2 = [];
                    for (let i = 0; i < jsons1.length; i++) {
                        if (jsons1[i].meta) {
                            jsons2.push(jsons1[i]);
                        }
                    }
                    var asyncRouterMap = generateAsyncRouter(routerMap, jsons2);
                    accessedRouters = filterAsyncRoutes(asyncRouterMap, roles);
                    var res = accessedRouters.concat({
                        path: "*",
                        redirect: "/404",
                        hidden: true
                    });
                    res.unshift(getHomeRoutes(roles));
                    commit("SET_ROUTES", res);
                    resolve(res);
                });
            });
        }
    }
};

export default permission;